package org.itstack.state.order;

import java.time.LocalDateTime;
import java.util.ArrayList;
import java.util.List;

/**
 * 订单上下文类
 * 维护订单的当前状态和相关信息
 * 
 * 设计原则：
 * - 单一职责：只负责订单状态管理和转换
 * - 依赖倒置：依赖抽象订单状态接口
 * - 开闭原则：通过状态类扩展行为
 */
public class OrderContext {
    
    private OrderState currentState;
    private final String orderId;
    private final String customerId;
    private final double amount;
    private final LocalDateTime createTime;
    private final List<String> stateHistory;
    
    /**
     * 构造函数
     * @param orderId 订单ID
     * @param customerId 客户ID
     * @param amount 订单金额
     */
    public OrderContext(String orderId, String customerId, double amount) {
        this.orderId = orderId;
        this.customerId = customerId;
        this.amount = amount;
        this.createTime = LocalDateTime.now();
        this.stateHistory = new ArrayList<>();
        // 初始状态为待支付
        this.currentState = new PendingPaymentState();
        this.stateHistory.add("订单创建，状态：待支付");
    }
    
    /**
     * 获取订单ID
     * @return 订单ID
     */
    public String getOrderId() {
        return orderId;
    }
    
    /**
     * 获取客户ID
     * @return 客户ID
     */
    public String getCustomerId() {
        return customerId;
    }
    
    /**
     * 获取订单金额
     * @return 订单金额
     */
    public double getAmount() {
        return amount;
    }
    
    /**
     * 获取创建时间
     * @return 创建时间
     */
    public LocalDateTime getCreateTime() {
        return createTime;
    }
    
    /**
     * 获取当前状态名称
     * @return 当前状态名称
     */
    public String getCurrentState() {
        return currentState.getStateName();
    }
    
    /**
     * 获取当前状态描述
     * @return 当前状态描述
     */
    public String getCurrentStateDescription() {
        return currentState.getStateDescription();
    }
    
    /**
     * 设置新状态
     * @param newState 新状态
     */
    public void setState(OrderState newState) {
        String oldState = this.currentState.getStateName();
        this.currentState = newState;
        String newStateName = newState.getStateName();
        this.stateHistory.add(String.format("状态转换：%s -> %s", oldState, newStateName));
    }
    
    /**
     * 处理订单操作
     * @param action 操作类型
     */
    public void handleAction(OrderAction action) {
        if (currentState.canExecuteAction(action)) {
            currentState.handleAction(this, action);
        } else {
            System.out.println(String.format("订单 %s 在 %s 状态下无法执行 %s 操作", 
                orderId, currentState.getStateName(), action.getName()));
        }
    }



    
    /**
     * 获取状态历史
     * @return 状态历史列表
     */
    public List<String> getStateHistory() {
        return new ArrayList<>(stateHistory);
    }
    
    /**
     * 检查是否可以执行指定操作
     * @param action 操作类型
     * @return 是否可以执行
     */
    public boolean canExecuteAction(OrderAction action) {
        return currentState.canExecuteAction(action);
    }
    
    /**
     * 获取订单信息摘要
     * @return 订单信息摘要
     */
    public String getOrderSummary() {
        return String.format("订单ID: %s, 客户: %s, 金额: %.2f, 当前状态: %s", 
            orderId, customerId, amount, currentState.getStateName());
    }
}
